<?php
/**
 * 栖岛OAuth2 SDK使用示例
 * 
 * 本示例演示了如何使用栖岛OAuth2 SDK完成OAuth2授权流程
 * 包括:
 * 1. 初始化SDK
 * 2. 引导用户到授权页面
 * 3. 处理回调并获取用户信息
 * 4. 管理用户的授权应用列表
 */

// 引入SDK文件
require_once 'QidaoOAuth2SDK.php';

// 开启会话
session_start();

// 配置SDK
$config = [
    'client_id'     => 'qidao_test23432',     // 替换为您的客户端ID
    'client_secret' => 'opena4dce63e4388815e396f1a72e422',   // 替换为您的客户端密钥
    'redirect_uri'  => 'https://open.tvcloud.top/h5/index.php?action=callback', // 替换为您的回调地址
    'scope'         => 'user_name avatar email', // 请求的权限范围
    'debug'         => true, // 开发环境建议开启调试模式
];

// 初始化SDK
$qidao = new QidaoOAuth2SDK($config);

// 获取当前请求的操作
$action = isset($_GET['action']) ? $_GET['action'] : 'login';

// 根据不同的操作执行不同的逻辑
switch($action) {
    // 引导用户到授权页面
    case 'login':
        // 保存state用于后续验证
        $_SESSION['oauth2_state'] = $qidao->state;
        
        // 获取授权URL
        $authUrl = $qidao->getAuthorizationUrl();
        
        // 输出一个简单的页面，包含授权链接
        echo '<!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <title>栖岛OAuth2授权示例</title>
            <style>
                body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
                .btn { display: inline-block; background: #1677ff; color: white; padding: 10px 20px; 
                       text-decoration: none; border-radius: 4px; }
            </style>
        </head>
        <body>
            <h1>栖岛OAuth2授权示例</h1>
            <p>点击下面的按钮使用栖岛账号登录</p>
            <a href="' . htmlspecialchars($authUrl) . '" class="btn">使用栖岛账号登录</a>
        </body>
        </html>';
        break;
        
    // 处理授权回调
    case 'callback':
        // 验证state防止CSRF攻击
        if (!isset($_GET['state']) || !isset($_SESSION['oauth2_state']) || $_GET['state'] !== $_SESSION['oauth2_state']) {
            unset($_SESSION['oauth2_state']);
            die('无效的state参数，可能存在CSRF攻击风险');
        }
        
        if (isset($_GET['code'])) {
            try {
                // 显示调试信息
                echo '<div style="background:#f5f5f5;padding:15px;margin:15px 0;border:1px solid #ddd;border-radius:5px;font-family:monospace;">';
                echo '<h3>调试信息</h3>';
                echo '<p>授权码: ' . htmlspecialchars($_GET['code']) . '</p>';
                echo '<p>客户端ID: ' . htmlspecialchars($config['client_id']) . '</p>';
                echo '<p>回调URI: ' . htmlspecialchars($config['redirect_uri']) . '</p>';
                echo '</div>';
                
                // 使用授权码获取访问令牌 - 确保此步骤成功
                $token = $qidao->getAccessToken($_GET['code']);
                
                // 输出令牌信息用于调试
                echo '<div style="background:#e6f7ff;padding:15px;margin:15px 0;border:1px solid #91d5ff;border-radius:5px;font-family:monospace;">';
                echo '<h3>访问令牌信息</h3>';
                echo '<pre>' . htmlspecialchars(print_r($token, true)) . '</pre>';
                echo '</div>';
                
                // 将令牌保存到会话中
                $_SESSION['oauth2_token'] = $token;
                
                // 使用令牌获取用户信息 - 确保传入令牌
                $userInfo = $qidao->getUserInfo($token); // 这里是关键，必须传入token
                
                // 输出用户信息用于调试
                echo '<div style="background:#f6ffed;padding:15px;margin:15px 0;border:1px solid #b7eb8f;border-radius:5px;font-family:monospace;">';
                echo '<h3>用户信息</h3>';
                echo '<pre>' . htmlspecialchars(print_r($userInfo, true)) . '</pre>';
                echo '</div>';
                
                // 将用户信息保存到会话中
                $_SESSION['oauth2_user'] = $userInfo;
                
                echo '<p><a href="?action=profile" style="display:inline-block;background:#1677ff;color:white;padding:10px 20px;text-decoration:none;border-radius:4px;">继续到个人中心</a></p>';
                
            } catch (Exception $e) {
                echo '<div style="background:#fff0f0;padding:15px;margin:15px 0;border:1px solid #faa;border-radius:5px;">';
                echo '<h3>授权过程中出现错误</h3>';
                echo '<p>' . htmlspecialchars($e->getMessage()) . '</p>';
                echo '<h4>错误详情</h4>';
                echo '<pre style="background:#f5f5f5;padding:10px;overflow:auto;">';
                echo htmlspecialchars($e->getTraceAsString());
                echo '</pre>';
                echo '</div>';
                
                // 显示调试建议
                echo '<div style="background:#f5f5f5;padding:15px;margin:15px 0;border:1px solid #ddd;border-radius:5px;">';
                echo '<h3>调试建议</h3>';
                echo '<ol>';
                echo '<li>确认客户端ID和密钥是否正确</li>';
                echo '<li>确认回调URI在栖岛API后台的设置是否完全匹配</li>';
                echo '<li>查看服务器错误日志获取更多信息</li>';
                echo '<li>确认授权码未过期(授权码通常只能使用一次且有效期很短)</li>';
                echo '</ol>';
                echo '</div>';
                
                echo '<p><a href="?action=login" style="display:inline-block;background:#1677ff;color:white;padding:10px 20px;text-decoration:none;border-radius:4px;">重新尝试授权</a></p>';
            }
        } else if (isset($_GET['error'])) {
            echo '<div style="background:#fff0f0;padding:15px;margin:15px 0;border:1px solid #faa;border-radius:5px;">';
            echo '<h3>授权被拒绝</h3>';
            echo '<p>错误: ' . htmlspecialchars($_GET['error']) . '</p>';
            if (isset($_GET['error_description'])) {
                echo '<p>描述: ' . htmlspecialchars($_GET['error_description']) . '</p>';
            }
            echo '</div>';
            echo '<p><a href="?action=login" style="display:inline-block;background:#1677ff;color:white;padding:10px 20px;text-decoration:none;border-radius:4px;">重新尝试授权</a></p>';
        } else {
            echo '<div style="background:#fff0f0;padding:15px;margin:15px 0;border:1px solid #faa;border-radius:5px;">';
            echo '<h3>授权失败</h3>';
            echo '<p>未收到授权码。请确保授权流程正确完成。</p>';
            echo '</div>';
            echo '<p><a href="?action=login" style="display:inline-block;background:#1677ff;color:white;padding:10px 20px;text-decoration:none;border-radius:4px;">重新尝试授权</a></p>';
        }
        break;
        
    // 显示用户个人资料
    case 'profile':
        // 检查用户是否已登录
        if (!isset($_SESSION['oauth2_token']) || !isset($_SESSION['oauth2_user'])) {
            header('Location: ?action=login');
            exit;
        }
        
        $user = $qidao->createUser($_SESSION['oauth2_user']);
        
        echo '<!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <title>个人中心 - 栖岛OAuth2示例</title>
            <style>
                body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
                .btn { display: inline-block; background: #1677ff; color: white; padding: 10px 20px; 
                       text-decoration: none; border-radius: 4px; margin-right: 10px; }
                .avatar { width: 100px; height: 100px; border-radius: 50%; }
                .card { border: 1px solid #eee; border-radius: 8px; padding: 20px; margin-bottom: 20px; }
            </style>
        </head>
        <body>
            <h1>个人中心</h1>
            
            <div class="card">
                <h2>用户资料</h2>
                ' . (isset($user->avatar) ? '<img src="' . htmlspecialchars($user->avatar) . '" class="avatar"><br>' : '') . '
                <p><strong>用户名:</strong> ' . htmlspecialchars($user->name) . '</p>
                <p><strong>昵称:</strong> ' . htmlspecialchars($user->screenName) . '</p>
                ' . (isset($user->email) ? '<p><strong>邮箱:</strong> ' . htmlspecialchars($user->email) . '</p>' : '') . '
                ' . (isset($user->introduce) ? '<p><strong>简介:</strong> ' . htmlspecialchars($user->introduce) . '</p>' : '') . '
            </div>
            
            <p>
                <a href="?action=authorizations" class="btn">查看我的授权应用</a>
                <a href="?action=logout" class="btn" style="background: #ff4d4f;">退出登录</a>
            </p>
        </body>
        </html>';
        break;
        
    // 显示并管理用户的授权应用列表
    case 'authorizations':
        // 检查用户是否已登录
        if (!isset($_SESSION['oauth2_token'])) {
            header('Location: ?action=login');
            exit;
        }
        
        try {
            // 获取授权应用列表
            $authList = $qidao->getUserAuthorizations($_SESSION['oauth2_token']);
            
            echo '<!DOCTYPE html>
            <html>
            <head>
                <meta charset="UTF-8">
                <title>我授权的应用 - 栖岛OAuth2示例</title>
                <style>
                    body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
                    .btn { display: inline-block; background: #1677ff; color: white; padding: 8px 16px; 
                           text-decoration: none; border-radius: 4px; }
                    .btn-danger { background: #ff4d4f; }
                    .app-card { border: 1px solid #eee; border-radius: 8px; padding: 15px; margin-bottom: 15px; }
                    .app-logo { width: 48px; height: 48px; float: left; margin-right: 15px; border-radius: 8px; }
                    .tag { display: inline-block; background: #f0f0f0; color: #666; padding: 2px 8px; 
                          border-radius: 10px; font-size: 12px; margin-right: 5px; margin-bottom: 5px; }
                </style>
            </head>
            <body>
                <h1>我授权的应用</h1>';
                
            if (empty($authList)) {
                echo '<p>您还没有授权过任何应用。</p>';
            } else {
                foreach ($authList as $auth) {
                    echo '<div class="app-card">';
                    
                    if (!empty($auth['logo'])) {
                        echo '<img src="' . htmlspecialchars($auth['logo']) . '" class="app-logo" alt="应用图标">';
                    }
                    
                    echo '<h3>' . htmlspecialchars($auth['clientName']) . '</h3>';
                    echo '<p>' . (isset($auth['description']) ? htmlspecialchars($auth['description']) : '无描述') . '</p>';
                    
                    echo '<p><strong>授权范围:</strong> ';
                    if (!empty($auth['scope'])) {
                        $scopes = explode(' ', $auth['scope']);
                        foreach ($scopes as $scope) {
                            echo '<span class="tag">' . htmlspecialchars($scope) . '</span>';
                        }
                    }
                    echo '</p>';
                    
                    echo '<p><strong>授权时间:</strong> ' . date('Y-m-d H:i:s', $auth['createdTime']) . '</p>';
                    
                    echo '<form method="post" action="?action=revoke" style="margin-top: 10px">';
                    echo '<input type="hidden" name="auth_id" value="' . htmlspecialchars($auth['id']) . '">';
                    echo '<button type="submit" class="btn btn-danger">撤销授权</button>';
                    echo '</form>';
                    
                    echo '<div style="clear: both"></div>';
                    echo '</div>';
                }
            }
                
            echo '<p><a href="?action=profile" class="btn">返回个人中心</a></p>
            </body>
            </html>';
            
        } catch (Exception $e) {
            echo '获取授权列表失败: ' . $e->getMessage();
            echo '<p><a href="?action=profile">返回个人中心</a></p>';
        }
        break;
        
    // 撤销特定授权
    case 'revoke':
        // 检查用户是否已登录
        if (!isset($_SESSION['oauth2_token'])) {
            header('Location: ?action=login');
            exit;
        }
        
        // 检查是否提交了授权ID
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['auth_id'])) {
            try {
                // 撤销授权
                $result = $qidao->revokeAuthorization($_SESSION['oauth2_token'], $_POST['auth_id']);
                
                // 设置成功消息
                $_SESSION['message'] = '授权已成功撤销！';
                
                // 重定向回授权列表页面
                header('Location: ?action=authorizations');
                exit;
                
            } catch (Exception $e) {
                echo '撤销授权失败: ' . $e->getMessage();
                echo '<p><a href="?action=authorizations">返回授权列表</a></p>';
            }
        } else {
            // 如果没有提交授权ID，重定向回授权列表
            header('Location: ?action=authorizations');
            exit;
        }
        break;
        
    // 退出登录
    case 'logout':
        // 清除会话数据
        unset($_SESSION['oauth2_token']);
        unset($_SESSION['oauth2_user']);
        unset($_SESSION['oauth2_state']);
        
        // 重定向到登录页
        header('Location: ?action=login');
        exit;
        break;
        
    // 默认情况下重定向到登录操作
    default:
        header('Location: ?action=login');
        exit;
} 